(function($) {
    $.fn.DataTableGrid=function(options){
        var defaults={
            /**
             * 数据格式
             * {"page":3,"pageSize":10,"total":22,"root":[]}
             */
            root:null,                                  //数据{"page":3,"pageSize":10,"totalPages":0,"total":22,"root":[]}
            /**
             * 数据格式
             * [{a:"",b:3},{a:"",b:3}]
             */
            data:[],                                    //数据
            /**
             *列信息
             * name 数据data 属性名 必填×，并且 数据必须存在属性
             * title    标题显示名称 必填×
             * style    当前标题的style 例如：width: 260px 当前列宽 ，可不填写
             * type     数据类型 可不填写
             * type     数据类型 date 格式化数据日期格式;数据类型 modify 自行处理数据 属性 ready 方法必须重写 ready:function(bean,i); bean 当前对象，i 当前行数 必须返回数据value
             * type     button 返回按钮数据组 ready 方法必须重写 ready:function(bean,i,td)
             * buttion 返回数组格式[{text:"",css"",href:"",target:"",icon:""},{text:"",css:"",icon:"",click:function(){}}]
             * 按钮数据组 属性说明：text:按钮标题，css: 按钮样式例如：btn btn-success btn-sm , href：链接地址，target：targer 属性,icon 图标样式例如：glyphicon glyphicon-zoom-in icon-white
             * click 按钮方法function(){};
             * onclick editid(id);
             * hdcss	表头css样式 可不填写
             * tdcss	表格css 样式 可不填写
             * tdstyle  表格style 样式 可不填写
             * type     类型为 ready ready方法无返回数据, ready 必须重写 ready : function(bean,i,td) bean 当前数据，i 当前行，td 当前td 控件
             * 例如：{name:"roleStatus",title:"状态",type:"modify",ready:function(bean,i){
                        var value=bean.roleStatus;
                        for(var i=0;i<roleStatusEnum.length;i++){
                            if(roleStatusEnum[i].key==value){
                                return roleStatusEnum[i].value;
                            }
                        }
                    }},
                    {name:"roleStatus",title:"操作",style:"width: 260px",type:"ready",ready:function(bean,i,td){
                        //after
                        var zoom_in=$("<i class=\"glyphicon glyphicon-zoom-in icon-white\"></i>");
                        var btns=$("<a ></a>").attr("href","<%=request.getContextPath()%>/web/role/perm/"+bean.id)
                                .attr("target","_blank").addClass("btn btn-success btn-sm")
                                .append(zoom_in).append("授权");
                        var edit_ic=$("<i class=\"glyphicon glyphicon-edit icon-white\"></i>");
                        var btn0=$("<a></a>").attr("href","#").click(function(){onedit(bean.id);})
                                .addClass("btn btn-info btn-sm").append(edit_ic).append("修改");
                        //btns.prepend(btn0);
                        var trash_ic=$("<i class=\"glyphicon glyphicon-trash icon-white\"></i>");
                        var btn1=$("<a href=\"#\" class=\"btn btn-danger btn-sm\"></a>")
                                .click(function(){ondel(bean.id);}).append(trash_ic).append("删除");

                        td.append(btns);
                        td.append("\r\n");
                        td.append(btn0);
                        td.append("\r\n");
                        td.append(btn1);
                    }},
                    {name:"roleStatus",title:"操作",style:"width: 260px",type:"button",ready:function(bean,i,td){
                        var btns=[{text:"授权",css:"btn btn-success btn-sm"
                        ,href:"<%=request.getContextPath()%>/web/role/perm/"+bean.id
                        ,target:"_blank",icon:"glyphicon glyphicon-zoom-in icon-white"}
                        ,{text:"修改",css:"btn btn-info btn-sm",icon:"glyphicon glyphicon-edit icon-white"
                        ,click:function(){onedit(bean.id);}}
                         ,{text:"删除",css:"btn btn-danger btn-sm",icon:"glyphicon glyphicon-trash icon-white"
                         ,click:function(){ondel(bean.id);}}
                        ];
                        return btns;
                    }},
                    {name:"datetime",title:"时间", type:"date", formatDate:"yyyy-MM-dd HH:mm:ss"}
             * type     数据类型 date formatDate可填可不填写，不填写是默认 "yyyy-MM-dd"
             *
             * 数据样例：
             * {name:"roleNO",title:"编号"},
             {name:"roleStatus",title:"状态",type:"modify",ready:function(bean,i){
                 var value=bean.roleStatus;
                 for(var i=0;i<roleStatusEnum.length;i++){
                     if(roleStatusEnum[i].key==value){
                         return roleStatusEnum[i].value;
                     }
                 }
             }},
             {name:"roleStatus",title:"操作",style:"width: 260px",type:"button",ready:function(bean,i,td){
                 var btns=[{text:"授权",css:"btn btn-success btn-sm"
                     ,href:"<%=request.getContextPath()%>/web/role/perm/"+bean.id
                     ,target:"_blank",icon:"glyphicon glyphicon-zoom-in icon-white"}
                     ,{text:"修改",css:"btn btn-info btn-sm",icon:"glyphicon glyphicon-edit icon-white"
                         ,click:function(){onedit(bean.id);}}
                     ,{text:"删除",css:"btn btn-danger btn-sm",icon:"glyphicon glyphicon-trash icon-white"
                         ,click:function(){ondel(bean.id);}}
                 ];
                 return btns;
             }}
             * */
            column:[],                                  //列信息
            //thiscss:"portlet-body ",								//本身div css样式
            thiscss:"box-content",
            //tabcss:"table table-bordered table-hover",      //table css 样式
            tabcss:"table table-striped table-bordered responsive",
            backPageText:" 上一页 ",                           //上一页 显示文字
            nextPageText:" 下一页 ",                           //下一页 显示文字
            showAllRecord:true,                         //显示所有记录数
            showInput:true,                             //显示输入页数
            countTextCss:"dataTables_info",				//记录数字体 样式
            paginIndexCss:"paging_index",				//输入页数样式
            paginCss:"pagination col-md-12 center-block",            //分页控件css样式
            ulcss:"pagination pagination-centered",     //分页选择按钮ul样式
            //colbtncss:"btn btn-success btn-mini",      //默认列中 btn css 样式
            colbtncss:"",								//默认列中 btn css 样式
            colbtnicon:"icon-pencil",					//默认列中 btn css 样式
            select:function(){},                       //选中方法  (pageIndex,th)页面当前索引，控件类
            nowPage:0,                                  //当前页
            keyId:0,
            allRecord:0,                                //所有记录数
            pageSize:20,                                //当前页面大小
            showPageNumber:4,                           //显示页面数字
            isPaging:true                               //是否显示分页
        };
        if(options.root!=null){
            if(options.root.pageSize!=null && options.root.pageSize>0){
                options.pageSize=options.root.pageSize;
            }
            if(options.root.total!=null && options.root.total>0){
                options.allRecord=options.root.total;
            }
            if(options.root.root!=null && options.root.root.length>0){
                options.data=options.root.root;
            }
            if(options.root.page!=null && options.root.page>0){
                options.nowPage=options.root.page;
            }
        }
        var opt=$.extend(defaults,options);
        var $thisobj = $(this);
        $thisobj.html("");
        //$thisobj.addClass(opt.tabcss);
        $thisobj.addClass(opt.thiscss);
        var table=$("<table class=\""+opt.tabcss+"\"></table>");
        table.append(initthead(opt));
        table.append(inittbody(opt));

        $thisobj.append(table);
        //显示分页
        if(opt.isPaging){
            initPaging(opt,$thisobj);
        }
    };

    /**
     * 分页显示
     */
    var initPaging=function(opt,$thisobj){
        setAllRecord(opt.allRecord,opt);
        setPageSize(opt.pageSize,opt);
        setNowPage(opt.nowPage,opt);

        var backPage=0;
        var nextPage=2;
        var nowPage=getNowPage(opt);
        back(opt);
        backPage=getNowPage(opt);
        setNowPage(nowPage,opt);
        next(opt);
        nextPage=getNowPage(opt);
        setNowPage(nowPage,opt);

        $thisobj.attr("pageIndex",nowPage);
        if(opt.allRecord>opt.pageSize){
            var alldiv=$("<div class=\""+opt.paginCss+"\"></div>");
            var allul=$("<ul class=\""+opt.ulcss+"\"></ul>");

            var pageNumbers=getPageListNumber(opt);
            //上一页按钮
            var backPageLi=$("<li class=\"active\"></li>");
            var backPageA=$("<a href=\"#\"></a>").text(opt.backPageText);
            if(backPage!=nowPage){
                backPageLi=$("<li></li>");
                backPageA=$("<a href=\"#\"></a>").attr("pageIndex",backPage).text(opt.backPageText);
                backPageA.click(function(){
                    var pageIndex=$(this).attr("pageIndex");
                    opt.select(pageIndex,$(this));
                });
            }
            backPageLi.append(backPageA);
            allul.append(backPageLi);
            //中间页数展示

            if(pageNumbers!=null && pageNumbers.length>0){
                for(var j=0;j<pageNumbers.length;j++){
                    var i=pageNumbers[j];
                    if(i==nowPage){
                        var _li=$("<li class=\"active\"></li>").append($("<a href=\"#\"></a>").text(i));
                        allul.append(_li);
                    }else{
                        var _li=$("<li></li>").append($("<a href=\"#\"></a>")
                            .attr("pageIndex",i).text(i)
                            .click(function(){
                                var pageIndex=$(this).attr("pageIndex");
                                opt.select(pageIndex,$(this));

                            }));
                        allul.append(_li);
                    }
                }
            }

            //下一页

            var nextPageLi=$("<li class=\"active\"></li>").append($("<a href=\"#\"></a>").text(opt.nextPageText));
            if(nextPage!=nowPage){
                var lia=$("<a href=\"#\"></a>");
                lia.text(opt.nextPageText)
                    .attr("pageIndex",nextPage)
                    .click(function(){
                        var pageIndex=$(this).attr("pageIndex");
                        opt.select(pageIndex,$(this));
                    });

                nextPageLi=$("<li></li>").append(lia);
            }
            allul.append(nextPageLi);

            //显示输入页数
            var pageIndexName=$thisobj.attr("id")+"_pagination_index";
            if(opt.showInput){
            	var tmpinput=$("<input id=\""+pageIndexName+"\" class=\"form-control\" type=\"text\" >")
            	//.unbind("click").removeAttr("onclick")
            	.attr("pageIndex",nowPage)
                .val(nowPage)
                .keydown(function(event){
                    var curkey = event.which;
                    if (curkey == 13){
                        opt.select($(this).val(),$(this));
                    }
                });
                var _input=$("<li class=\"active\" ></li>")
                    .append($("<a href=\"#\" class=\"pagination_index\"></a>")
                        .append(tmpinput));
                allul.append(_input);
                allul.append($("<li class=\"active\" ></li>").append($("<a href=\"#\"></a>").text("页")));
                
            }
            //显示总数据
            if(opt.showAllRecord){
                var allRecord=getAllRecord(opt);
                allul.append($("<li class=\"active\"></li>").append($("<a href=\"#\"></a>").text("共 "+allRecord+" 条")));
            }

            alldiv.append(allul);
            $thisobj.next().remove();
            $thisobj.after(alldiv);
        }else{
        	$thisobj.next().remove();
        }
    };

    /**
     * 表头内容
     */
    var initthead=function (opt){
        var thead=$("<thead></thead>");
        var tr=$("<tr></tr>");
        var col=opt.column;
        if(col!=null && col.length>0){
            for(var i=0;i<col.length;i++){
                var cl=col[i];
                var hdcss="";
                if(cl.hdcss!=null && cl.hdcss.length>0){
                	hdcss=" class=\""+opt.hdcss+"\"";
                }
                var th=$("<th"+hdcss+"></th>").html(cl.title);
                if(cl.style!=null && cl.style.length>0){
                    th.attr("style",cl.style);
                }
                tr.append(th);
            }
        }
        thead.append(tr);
        return thead;
    };

    
    /**
     * 表格显示
     */
    var inittbody=function(opt){
        var tbody=$("<tbody></tbody>");
        var list=opt.data;
        var col=opt.column;
        if(list!=null && list.length>0){
            for(var i=0;i<list.length;i++){
                var tr=$("<tr></tr>");
                var bean=list[i];
                if(col!=null && col.length>0){
                    for(var j=0;j<col.length;j++){
                        var cl=col[j];
                        var value=bean[cl.name];
                        var tdcss="";
                        if(cl.tdcss!=null && cl.tdcss.length>0){
                        	tdcss=" class=\""+cl.tdcss+"\""
                        }
                        if(cl.tdstyle!=null && cl.tdstyle.length>0){
                        	tdcss+=" style=\""+cl.tdstyle+"\"";
                        }
                        var td=$("<td"+tdcss+"></td>");
                        if(cl.type=="modify"){
                            value=cl.ready(bean,i);
                        }else if(cl.type=="ready"){
                            cl.ready(bean,i,td);
                            value="";
                        }else if(cl.type=="button"){
                            value="";
                            initButton(cl.ready(bean,i,td),td,opt);
                        }else if(cl.type=="date"){
                        	if(value!=null && value>0){
                        		var date=new Date(value);
                        		value = this.formatDate(date,cl.formatDate);
                        	}else{
                        		value="";
                        	}
                        }
                        td.append(value);
                        tr.append(td);
                    }
                }
                tbody.append(tr);

            }
        }
        return tbody;
    };

    var initButton=function(col,td,opt){
        var btns=col;
        if(btns!=null && btns.length>0){
            for(var i=0;i<btns.length;i++){
                var btn = btns[i];
                var str="";
                if(btn.css!=null && btn.css.length>0){
                    str+=" class=\""+btn.css+"\" ";
                }else{
                    str+=" class=\""+opt.colbtncss+"\" ";
                }
                if(btn.href!=null && btn.href.length>0){
                    str+=" href=\""+btn.href+"\" ";
                }else{
                    //str+=" href=\"#\" ";
                }
                if(btn.target!=null && btn.target.length>0){
                    str+=" target=\""+btn.target+"\" ";
                }
                if(btn.onclick!=null && btn.onclick.length>0){
                	str+=" onclick=\""+btn.onclick+"\" ";
                }
                var ad=$("<a "+str+"></a>");
                if($.isFunction(btn.click)){
                    ad.click(btn.click);
                }
                var icon_css=opt.colbtnicon;
                if(btn.icon!=null && btn.icon.length>0){
                    icon_css=btn.icon;
                }
                var icon=$("<i class=\""+icon_css+"\"></i>");
                ad.append(icon).append(btn.text);
                td.append(ad);
                td.append("\r\n");
            }

        }
    };


    /**
     * 返回共有多少页
     * @returns {number}
     */
    var getAllPage=function(options){

        if(options.pageSize>0){
            return parseInt((options.allRecord + options.pageSize - 1) / options.pageSize);
        }else{
            return 1;
        }
    };


    /**
     * 返回当前页，进行了边界检查
     * @returns {number}
     */
    var getNowPage=function(options){
        if(options.nowPage < 1)return 1;
        else if( options.nowPage > getAllPage(options)){
            options.nowPage = getAllPage(options);
        }
        return options.nowPage;
    };

    /**
     * 返回上一页
     */
    var back=function(options){
        setNowPage(options.nowPage - 1,options);
    };

    /**
     * 进入下一页
     */
    var next = function(options){
        setNowPage(options.nowPage + 1,options)
    };

    /**
     * 设置当前的页面
     * @param page
     */
    var setNowPage=function(page,options){
        if(page<1)options.nowPage=1;
        else if(page>getAllPage(options)){
            options.nowPage=getAllPage(options);
        }else{
            options.nowPage= page;
        }
    };

    var getPageSize =function(options){
        return options.pageSize;
    };

    /**
     * 设置一页显示多少条记录
     * @param size
     */
    var setPageSize =function(size,options){
        if(size!=options.pageSize){
            if(size>0 && options.pageSize >0){
                setNowPage(((getNowPage() -1)*options.pageSize +1)/size +1,options);
            }else{
                setNowPage(1,options);
            }
        }
        options.pageSize=size;
    };

    /**
     * 取得总记录数
     * @returns {number}
     */
    var getAllRecord = function (options) {

        return options.allRecord;
    };

    var setAllRecord = function(all,options){
        options.allRecord=all;
    }

    var getStartRow = function(){
        if(getNowPage(options) >0){
            return (getNowPage(options) -1)*getPageSize(options);
        }
    }

    var getEndRow = function(options){
        var endRecord=getAllPage(options);
        if(getPageSize(options)!=0){
            endRecord=getPageSize(options)*getNowPage(options);
        }
        if(endRecord>getAllPage(options)){
            endRecord=getAllPage(options);
        }
        return endRecord;
    }

    var getPageListNumber =function(options){
        var a=new Array();
        var max=getNowPage(options)+options.showPageNumber;
        var min=getNowPage(options)-options.showPageNumber;
        if(min<1){
            min=1;
        }
        if(max>getAllPage(options)){
            max=getAllPage(options);
        }
        var len=0;
        for(var i=min;i<=max;i++){
            a[len]=i;
            len++;
        }
        return a;
    };

    var formatDate= function(value, dateformat){
        function getFormatDate(date, dateformat)
        {
            var g = this, p = this.options;
            if (isNaN(date)) return null;
            var format = dateformat;
            var o = {
                "M+": date.getMonth() + 1,
                "d+": date.getDate(),
                "h+": date.getHours(),
                "m+": date.getMinutes(),
                "s+": date.getSeconds(),
                "q+": Math.floor((date.getMonth() + 3) / 3),
                "S": date.getMilliseconds()
            };
            if (/(y+)/.test(format))
            {
                format = format.replace(RegExp.$1, (date.getFullYear() + "")
                    .substr(4 - RegExp.$1.length));
            }
            for (var k in o)
            {
                if (new RegExp("(" + k + ")").test(format))
                {
                    format = format.replace(RegExp.$1, RegExp.$1.length == 1 ? o[k]
                        : ("00" + o[k]).substr(("" + o[k]).length));
                }
            }
            return format;
        }
        if (!value) return "";
        // /Date(1328423451489)/
        if (typeof (value) == "string" && /^\/Date/.test(value))
        {
            value = value.replace(/^\//, "new ").replace(/\/$/, "");
            eval("value = " + value);
        }
        if (value instanceof Date)
        {
            var format = dateformat || "yyyy-MM-dd";
            return getFormatDate(value, format);
        }
        else
        {
            return value.toString();
        }

    };

})(jQuery);